package study.JavaAdvanced;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

/**
 * date:2025.10.24
 * title:Java泛型
 * author:fzy
 */
//参数化类型
//允许在定义类，方法，接口时候使用类型参数表述数据类型，参数化类型
//跟Ts没啥差别。。感觉
//泛型参数只能是引用类型，不能是原始类型
    //命名约定：T-任意类型  E-集合中的元素类型 K-键类型 V-值类型 N-数值类型


public class Java_6 {
    public static void main(String[] arg) {
        GenericDemo.GenericTest();
    }
}

class GenericDemo{
    static void GenericTest(){
//        Collection c = new ArrayList();
        Collection<String> c = new ArrayList<>();
        c.add("111");
        c.add("222");
        c.add("333");
        //不适用泛型这里不会提示错误
//        c.add(100);
        Iterator<String> cit = c.iterator();
//        Iterator cit = c.iterator();
        while (cit.hasNext()){
            //加入泛型不需要加强制类型转换
//            String s = (String) cit.next();
            String s =  cit.next();
            System.out.println(s);
        }
//      提高类扩展性
        StudentGeneric stu = new StudentGeneric<String>();
        stu.setAge("12");
        StudentGeneric stu2 = new StudentGeneric<Integer>();
        stu2.setAge(23);
        //提高方法灵活性
        GenericClassMethod.show("a");
        GenericClassMethod.show("b");
        GenericClassMethod.show(123123);
        GenericClassMethod.show(1.23321123f);
        GenericClassTest.test();
    }
}
//泛型类
class StudentGeneric<K>{
    String name;
    K age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public K getAge() {
        return age;
    }

    public void setAge(K age) {
        this.age = age;
    }

}

class GenericClassMethod{
    //java静态方法也可以重载
//    static void show(String s){
//
//    }
//    static void show(Integer a){
//
//    }
    //泛型方法
    static <T> void show(T a){

    }
}

//泛型接口
interface GenericInfo<T>{
    void show(T a);
}

//泛型接口在实现时，实现类必须实现泛型参数
class GenericInfoImpl<T> implements GenericInfo<T>{
    @Override
    public void show(T a) {

    }
}

//类型通配符
/*
List<?>
这种带通配符的List表示是所有泛型的父类，不能添加元素
类型通配符上限
List<?extend T>表示是T泛型的父类
类型通配符下限
List<?super T>表示是T泛型的子类
 */
class GenericClassTest{
    static void test(){
        //类型通配符
        List<?> a1 = new ArrayList<>();
        List<?> a2 = new ArrayList<Integer>();
        List<?> a3 = new ArrayList<Object>();
        //类型通配符上限,支持该类型的子类型，
        List<?extends Number> a4 = new ArrayList<Integer>();
        //类型通配符下线，支持该类型的父类
        List<?super Integer> a5 = new ArrayList<Number>();
        List<?super String> a6 = new ArrayList<Object>();
     }
}